import com.fasterxml.jackson.databind.ObjectMapper;
import dao.MessageDao;
import model.Message;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author quan
 * @Description 实现前后端的交互
 * @Date 2023/6/28 20:14
 */

/**
 Tomcat在启动的时候，自己有一个main方法，Servlet自己里面没有main方法，Tomcat在启动的时候，会在整个工程里面找所有加了注解@webServlet（“URL”）的类，
 并将它识别为Servlet，调用init()方法初始化；而且会找到注解相应的路径，根据用户URL中的地址，解析出时哪一个Servlet，再执行它的doGet和doPost方法。
 */

@WebServlet("/message")
public class MessageServlet extends HttpServlet {
    //0、定义数据库访问类
    private MessageDao messageDao = new MessageDao();
    //定义json转换的工具类
    private ObjectMapper objectMapper = new ObjectMapper();

    /**
     * doGet方法：获取服务器信息
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、定义编码格式
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json;charset=utf-8");
        //2、查询数据库中的留言列表
        List<Message> messages = messageDao.selectAll();
        //3、判断结构是否为空
        if(messages == null){
            //4、如果是空，要进行处理，避免返回的是"null"字符串；
            // 处理后符合json格式
            messages = new ArrayList<Message>();
        }
        //5、将结果转为json并返回
        String jsonStr = objectMapper.writeValueAsString(messages);
        //6、返回结果：之前的写法：状态码，msg,data,data中其实写的就是我们的jsonStr
        resp.getWriter().write(jsonStr);
    }

    /**
     * doPost将数据传送给服务器端
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、定义编码格式
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json;charset=utf-8");
        //2、接收用户请求中的数据(是一个Json字符串)，转化为Message类
        //req.getInputStream()用于请求body中的内容，返回一个InputStream对象
        Message message = objectMapper.readValue(req.getInputStream(),Message.class);
        //3、对接收的数据进行非空校验
        if(message == null ||message.getSender() == null|| message.getSender().equals("")||
                message.getReceiver() == null || message.getReceiver().equals("")
                || message.getContent().equals("") || message.getContent() == null){
            //返回错误：自定义的状态码
            resp.getWriter().write("{\"code\":-1}");
        }
        //4、向数据库中写入数据：调用DAO写入
        int row = messageDao.insert(message);
        if(row <= 0){
            //返回错误：自定义的状态码
            resp.getWriter().write("{\"code\":-1}");
            return;
        }
        //5、返回成功
        resp.getWriter().write("{\"code\":0}");

    }
}
